package com.le.enhance.class7;

import org.junit.Test;

/**
 * 给定两个有符号32位整数a和b，返回a和b中较大的。
 * 【要求】
 * 不用做任何比较判断。
 */
public class Code_01_getMaxNotEquals {
    // 对y取反, 0 --> 1, 1 --> 0
    public static int flip(int y) {
        return y ^ 1;
    }

    // 获取x的符号,非负为1,否则为0
    public static int sign(int x) {
        return flip((x >> 31) & 1);
    }

    // 存在溢出
    public static int getMax(int a, int b) {
        int c = a - b;
        int sc = sign(c); // 获取C的符号,非负为1
        int scNot = flip(sc); // 获取c的相反数, 1 -->0 , 0 -->1
        return sc * a + scNot * b;
    }

    public static int getMax2(int a, int b) {
        int c = a - b;
        int sa = sign(a);
        int sb = sign(b);
        int sc = sign(c);
        int sab = sa ^ sb; // 判断a,b符号是否相同,相同为0,否则为1
        int notSab = flip(sab);
        int returnA = sab * sa + notSab * sc;
        int returnB = flip(returnA);
        return returnA * a + returnB * b;
    }

    @Test
    public void test() {
        int a = 12;
        int b = 6;
        System.out.println(getMax(a, b));
        System.out.println(getMax2(a,b));
        a = 2147483647;
        b = -2147480000;
        System.out.println(getMax(a, b)); // over flow 溢出
        System.out.println(getMax2(a,b));
    }
}
